//
// Created by Jisam on 30/08/2024 8:12 PM.
// Solution of  P1387 最大正方形
// 2024-08-30 20:29:28 AC 100
//#pragma GCC optimize(3)
#include <bits/stdc++.h>

using namespace std;
#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>
#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define code_by_jisam ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
typedef long long i64;
typedef unsigned u32;
typedef unsigned long long u64;
typedef __int128 i128;
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1,};
int dy[] = {0, 0, -1, 1, 1, -1, -1, 1,};

// 定义最大整数常量MAXN，用于限定数组的大小
const int MAXN = 105;
// 定义二维数组a和sum，分别用于存储原始数据和累积和
int a[MAXN][MAXN],sum[MAXN][MAXN];

/**
 * solution函数用于解决特定的问题：寻找一个矩阵中最大的正方形子矩阵
 * 首先读取矩阵的尺寸n和m，然后读取矩阵中的每个元素
 * 接着通过计算每个位置的累积和，为后续查找正方形子矩阵提供基础
 * 之后，通过遍历矩阵的每个位置，并尝试以每个位置为起点找出最大的正方形子矩阵
 * 最后输出最大的正方形子矩阵的边长
 */
void solution() {
    // 声明变量n和m，分别代表矩阵的行数和列数
    int n,m;
    // 从标准输入读取行数n和列数m
    cin >> n >> m;

    // 声明变量s，用于存储n和m中的最小值，即最大可能的正方形边长
    int s = min(n,m);

    // 声明变量ans，用于记录最大正方形的边长，初始化为0
    int ans = 0;

    // 二维数组a用于存储矩阵元素，sum用于存储元素的累积和
    // 初始化sum数组的第一行和第一列
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) {
            // 读取矩阵元素
            cin >> a[i][j];
            // 计算并更新元素的累积和
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
        }

    // 遍历矩阵的每个元素，寻找可能的最大正方形
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) {
            // 遍历每个可能的正方形边长
            for(int l=1;l<=s;l++) {
                // 计算正方形的右下角坐标
                int rx=i+l-1;
                int ry=j+l-1;
                // 如果正方形超出矩阵边界，或者正方形区域的元素和不等于l*l（即正方形面积），则跳出循环
                if(rx>n || ry>m || sum[rx][ry]-sum[rx][j-1]-sum[i-1][ry]+sum[i-1][j-1]!=l*l) break;
                // 如果当前正方形边长l大于已知的最大边长ans，则更新ans
                if(ans<l) ans=l;
            }
        }
    // 输出最大正方形的边长
    cout << ans;
}



int main() {
    code_by_jisam;
    int T = 1;
//    cin >> T;
    while (T--) {
        solution();
    }
    return 0;
}